home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOpus Plus
/
DOpus Plus.iso
/
Tutorial
/
C Guide
/
Simple_Module2
/
NotifyWindow
/
NotifyWindow.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-08-26
|
13KB
|
226 lines
/*******************************************************************
NotifyWindow.c
Does open a simple window with some easy gadgets and installs
also notification for events:
- DOpus quit
- DOpus hide
- DOpus show
- Diskchange
*********************************************************************/
#define PARENT
#include "/includes/Window.h"
/********************************************************************/
// locale prototypes
BOOL OpenDOpusWin( WindowHandle *wh );
BOOL HandleWindow( WindowHandle *wh );
BOOL InstallNotify( WindowHandle *wh );
BOOL HandleNotify( WindowHandle *wh );
/********************************************************************/
void OwnWindow( STRPTR args, struct Screen *screen )
{
WindowHandle *wh;
if( (wh = AllocMemH(mempool, sizeof(WindowHandle))) ) // allocate some memory
{
wh->screen = screen; // store the screen pointer
// now the change
if( InstallNotify(wh) )
{
if( OpenDOpusWin(wh) ) // open the window
{
// we copy now the arguments into the text gadget
// if we have supplied some...
SetGadgetValue( wh->olist, GADGET_ID_TEXT, (ULONG) args );
while( TRUE )
{
wh->signals = Wait( (wh->win ? 1 << wh->win->UserPort->mp_SigBit : NULL) | // wait for window events if window is open
1 << wh->notify_port->mp_SigBit );
if( wh->signals & 1 << wh->win->UserPort->mp_SigBit )
if( HandleWindow(wh) )
break; // does end the while loop
if( wh->signals & 1 << wh->notify_port->mp_SigBit )
if( HandleNotify(wh) )
break;
}
if( wh->win ) // again a small change !
CloseConfigWindow( wh->win );
}
RemoveNotifyRequest( wh->notify_handle ); // remove our request
while( !IsMsgPortEmpty(wh->notify_port) ) // clear the port
ReplyFreeMsg( GetMsg(wh->notify_port) );
DeleteMsgPort( wh->notify_port ); // and delete him
}
FreeMemH( wh ); // free our memory
}
}
/********************************************************************/
// This function does open our window. We could have done this in the
// function OwnWindow() too, but we need this function later again.
BOOL OpenDOpusWin( WindowHandle *wh )
{
NewConfigWindow ncfgwin; // we need a NewConfigWindow structure too
// of couse you could also allocate it with
// AllocMemH()...
// and have to fill it
ncfgwin.nw_Parent = wh->screen; // open on this screen
// getting a localized title...
ncfgwin.nw_Title = DOpusGetString( locale, MSG_WINDOW_TITLE );
ncfgwin.nw_Dims = &cfgwin; // a pointer to the ConfigWin structure
ncfgwin.nw_Locale = locale; // the module locale pointer (from modinit.c)
ncfgwin.nw_Port = NULL; // we doesn't supply a port
ncfgwin.nw_Font = NULL; // just taking the screen font
ncfgwin.nw_Flags = WINDOW_REQ_FILL | // fill with stripple pattern
WINDOW_AUTO_KEYS | // handle keys automatic
WINDOW_SCREEN_PARENT; // nw_Parent points to a screen
if( (wh->win = OpenConfigWindow(&ncfgwin)) ) // open the window
{
if( (wh->olist = AddObjectList(wh->win, odef)) ) // add the gadgets
return TRUE;
CloseConfigWindow( wh->win ); // in error case do not forget :-)
}
return FALSE;
}
/********************************************************************/
// we does only close the window, if the closegadget was pressed
// if you want to close it within a gadget, you must only in the
// right case set "stop" to TRUE
BOOL HandleWindow( WindowHandle *wh )
{
BOOL stop = FALSE;
ULONG value;
while( !stop && (wh->imsg = GetWindowMsg(wh->win->UserPort)) )
{
switch( wh->imsg->Class ) // let's handle the IDCMP
{
case IDCMP_GADGETUP:
switch( GET_ID(wh->imsg) )
{
case GADGET_ID_CYCLE: // we copy simply the same text to the text gadget
value = GetGadgetValue( wh->olist, GADGET_ID_CYCLE ) + MSG_CLICK_ME;
SetGadgetValue( wh->olist, GADGET_ID_TEXT, (ULONG) DOpusGetString(locale, value) );
break;
case GADGET_ID_OKAY: // doing a message
SetGadgetValue( wh->olist, GADGET_ID_TEXT, (ULONG) DOpusGetString(locale, MSG_OKAY_DONE) );
break;
case GADGET_ID_CANCEL:
SetGadgetValue( wh->olist, GADGET_ID_TEXT, (ULONG) DOpusGetString(locale, MSG_CANCEL_DONE) );
break;
}
break;
case IDCMP_CLOSEWINDOW:
// we can not simply return here, the IntuiMessage must replied first
stop = TRUE;
break;
}
ReplyWindowMsg( wh->imsg );
// remember: You should not use any other routines
// to get/reply the messages of this window than
// GetWindowMsg() and ReplyWindowMsg() !!
}
return stop;
}
/********************************************************************/
BOOL InstallNotify( WindowHandle *wh )
{
if( (wh->notify_port = CreateMsgPort()) ) // a private port is enough
{
if( (wh->notify_handle = AddNotifyRequest( DN_OPUS_HIDE | DN_OPUS_QUIT | DN_OPUS_SHOW | DN_DISKCHANGE,
NULL, wh->notify_port)) )
return TRUE;
DeleteMsgPort( wh->notify_port );
}
return FALSE;
}
BOOL HandleNotify( WindowHandle *wh )
{
BOOL ret_value = FALSE;
while( !ret_value && (wh->notify_msg = (DOpusNotify *) GetMsg(wh->notify_port)) )
{
switch( wh->notify_msg->dn_Type )
{
case DN_OPUS_QUIT: // we should quit
ret_value = TRUE;
break;
case DN_OPUS_HIDE: // we must close our window
CloseConfigWindow( wh->win );
wh->win = NULL; // do not forget this ! It's a kind of flag...
break;
case DN_OPUS_SHOW: // we can reopen our window, if it was closed
if( !wh->win )
OpenDOpusWin( wh );
break;
case DN_DISKCHANGE: // we set the value of our text gadget
if( wh->win )
{
sprintf( wh->buffer, "Diskchange in drive %s", wh->notify_msg->dn_Name );
SetGadgetValue( wh->olist, GADGET_ID_TEXT, (ULONG) wh->buffer );
}
break;
}
ReplyFreeMsg( (struct Message *) wh->notify_msg );
}
return ret_value;
}